Process-Scheduling 詳細的文字整理請參考 作業系統 Ch5 Process-Scheduling
POSIX 未命名信號量(Unnamed Semaphores)是一種用於進程間或執行緒間同步的機制。它們是 POSIX 標準的一部分,允許在不需要命名的情況下使用信號量來控制對共享資源的訪問。
未命名:
進程內或進程間同步:
初始化和銷毀:
sem_init
來初始化未命名信號量,並使用 sem_destroy
來銷毀它們。操作:
sem_wait
來減少信號量(進入臨界區),如果信號量的值為 0,則會阻塞。sem_post
來增加信號量(離開臨界區),這可能會喚醒正在等待的執行緒或進程。posix-unnamed-sem.c
/**
* Example illustrating POSIX unnamed semaphores
*
* Compilation (on Linux):
*
* gcc -lpthread posix-unnamed-sem.c
*
* This example includes the appropriate error checking
* that is not covered in the text.
*
* Note that OS X does not support unnamed sempahores
* so this program will not work on those systems.
*
* Operating System Concepts - Ninth Edition
* John Wiley & Sons - 2013.
*/
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>
int main(void)
{
sem_t sem;
/* 初始化信號量 sem。
第一個參數是指向信號量的指標。
第二個參數 0 表示這是一個進程內的信號量。
第三個參數 1 是信號量的初始值,表示資源可用;0 表示不可用。*/
if (sem_init(&sem,0,1) == -1)
printf("%s\n",strerror(errno));
/* 嘗試獲取信號量,如果信號量的值大於 0,它會減少信號量的值並進入臨界區。如果信號量的值為 0,則會阻塞,直到信號量的值大於 0。 */
if (sem_wait(&sem) != 0)
printf("%s\n",strerror(errno));
printf("*** Critical Section *** \n");
/* 釋放信號量,增加信號量的值 */
if (sem_post(&sem) != 0)
printf("%s\n",strerror(errno));
printf("*** Non-Critical Section *** \n");
/* 銷毀信號量,釋放其資源。 */
if (sem_destroy(&sem) != 0)
printf("%s\n",strerror(errno));
return 0;
}
Terminal
編譯並執行
gcc -lpthread posix-unnamed-sem.c
./a.out
結果:
未命名信號量提供了一種簡單而有效的方法來管理多執行緒或多進程間的同步,是 POSIX 標準中一個重要的同步工具。
參考:文字參考AI,程式部分 greggagne/OSC9e/ch5/posix-unnamed-sem.c